/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tela.enfermagem;

import ferramentas.CFG;
import ferramentas.Comunicacao;
import ferramentas.DataUtil;
import ferramentas.Query;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.activation.UnsupportedDataTypeException;
import javax.mail.MessagingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 *
 * @author Lauro
 */
public class formularioEnfermagem extends HttpServlet {

    private static final String TMP_DIR_PATH = System.getProperty("java.io.tmpdir");
    private File tmpDir = new File(TMP_DIR_PATH);
    private int MAX_SIZE_UPLOAD = 10 * 1024 * 1024; // 10Mb
    private String ENCODING = "UTF-8";
    private String email;
    private String nome;
    private String cpf;
    private int id;
    private String paginaInicial = "http://www.fen.ufg.br/";
    private String emailAdministrador = "izabete.ataide@gmail.com";

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, MessagingException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        try {
            SimpleDateFormat formatterData = new SimpleDateFormat("dd/MM/yyyy");
            SimpleDateFormat formatterDataMY = new SimpleDateFormat("MM/yyyy");
            Date inicioInscricoes = DataUtil.converterData(CFG.INICIO_INRICOES_ENFERMAGEM, DataUtil.DataFormat.DDMMAAAAHHMM);
            Date finalInscricoes = DataUtil.converterData(CFG.FIM_INRICOES_ENFERMAGEM, DataUtil.DataFormat.DDMMAAAAHHMM);
            Date agora = new Date();

            if (agora.after(finalInscricoes) || agora.before(inicioInscricoes)) {
                throw new UnsupportedDataTypeException();
            } else {
                ServletFileUpload handler = getHandler();

                // Check that we have a file upload request
                boolean isMultipart = ServletFileUpload.isMultipartContent(request);

                if (isMultipart) {
                    List items = getItemsRequest(request, handler);

                    out.println("<html>");
                    out.println("<head>");
                    out.println("<title>Ficha de Inscrição</title>");
                    out.println("</head>");
                    out.println("<body>");
                    out.println("Aguarde...<br />");

                    cpf = getParameter("cpf", items);
                    String cpfLimpo = cpf.replaceAll("\\.", "");
                    cpfLimpo = cpfLimpo.replaceAll("-", "");

                    String cursonivel = getParameter("cursonivel", items);

                    Query q = new Query();

                    boolean isCadastrado = false;
                    if (!cpf.isEmpty()) {
                        isCadastrado = q.isUsuarioCadastradoEnfermagem(cpf, cursonivel);
                    }

                    if (!isCadastrado) {
                        // == INFORMAÇÕES PESSOAIS
                        nome = getParameter("nome", items);
                        // == ENDEREÇO
                        String endereco = getParameter("endereco", items);
                        String bairro = getParameter("bairro", items);
                        String cep = getParameter("cep", items);
                        String cidade = getParameter("cidade", items);
                        String estado = getParameter("estado", items);

                        // == CONTATO
                        String telfixo = getParameter("telfixo", items);
                        String telcel = getParameter("telcel", items);
                        email = getParameter("email", items);

                        // == DADOS PESSOAIS NASCIMENTO
                        String pai = getParameter("pai", items);
                        String mae = getParameter("mae", items);
                        String nascimentoS = getParameter("nascimento", items);
                        Date nascimento;
                        try {
                            nascimento = formatterData.parse(nascimentoS);
                        } catch (ParseException e) {
                            nascimento = new Date();
                        }

                        String sexo = getParameter("sexo", items);
                        String cidadenasc = getParameter("cidadenasc", items);
                        String estadonasc = getParameter("estadonasc", items);
                        String pais = getParameter("pais", items);
                        String nacionalidade = getParameter("nacionalidade", items);
                        String estadocivil = getParameter("estadocivil", items);
                        if (estadocivil.equalsIgnoreCase("outros")) {
                            estadocivil = getParameter("estadociviloutros", items);
                        }

                        /// == DADOS REGISTRO
                        String rg = getParameter("identidade", items);
                        String ufrg = getParameter("ufidentidade", items);
                        String emissaorgS = getParameter("emissaoidentidade", items);
                        String emissoridentidade = getParameter("emissoridentidade", items);
                        Date emissaorg = null;
                        try {
                            emissaorg = formatterData.parse(emissaorgS);
                        } catch (ParseException e) {
                            emissaorg = new Date();
                        }
                        // Título
                        String titulo = getParameter("titulo", items);
                        String uftitulo = getParameter("uftitulo", items);
                        String zonatitulo = getParameter("zonatitulo", items);
                        String secaotitulo = getParameter("secaotitulo", items);

                        // == FORMAÇÃO
                        String curso = getParameter("curso", items);
                        String instituicaocurso = getParameter("instituicaocurso", items);
                        String iniciocursoS = getParameter("iniciocurso", items);
                        String fimcursoS = getParameter("fimcurso", items);
                        Date iniciocurso = null;
                        Date fimcurso = null;
                        try {
                            iniciocurso = formatterDataMY.parse(iniciocursoS);
                        } catch (ParseException e) {
                            iniciocurso = new Date();
                        }

                        try {
                            fimcurso = formatterDataMY.parse(fimcursoS);
                        } catch (ParseException e) {
                            fimcurso = new Date();
                        }

                        // == PROFISSIONAL
                        String localtrabalho = getParameter("localtrabalho", items);
                        String teltrabalho = getParameter("teltrabalho", items);
                        String cargotrabalho = getParameter("cargotrabalho", items);
                        String cidadetrabalho = getParameter("cidadetrabalho", items);
                        String estadotrabalho = getParameter("estadotrabalho", items);

                        // == LATTES
                        String linklattes = getParameter("linklattes", items);
                        // == CHECKBOXES
                        boolean computador = getParameter("computador", items) != null;
                        boolean termoedital = getParameter("termoedital", items) != null;

                        // == COMPROVANTES
                        FileItem certificadocurso = getFile("certificadocurso", items);
                        String arquivoCertificadoCurso = null;
                        FileItem indicacaotrabalho = getFile("indicacaotrabalho", items);
                        String arquivoIndicacaoTrabalho = null;

                        String caminhoArquivo = "";
                        File arquivoDocumento = null;
                        // Salvar certificadocurso
                        String extensao_arquivo1 = "";
                        if (certificadocurso.getSize() > 0) {
                            extensao_arquivo1 = getExtensaoArquivo(certificadocurso.getName());
                            String nomeArquivo = cpfLimpo + extensao_arquivo1;
                            caminhoArquivo = getPastaDocumentos() + CFG.ENFERMAGEM_CERTIFICADO_CURSO + System.getProperty("file.separator") + nomeArquivo;
                            arquivoDocumento = new File(caminhoArquivo);
                            certificadocurso.write(arquivoDocumento);
                            arquivoCertificadoCurso = nomeArquivo;
                        }
                        // Salvar indicacaotrabalho, caso não receba nenhum arquivo o mesmo escreve que não recebeu nada no banco de dados.
                        String extensao_arquivo2 = "";
                        if (indicacaotrabalho.getSize() > 0) {
                            extensao_arquivo2 = getExtensaoArquivo(indicacaotrabalho.getName());
                            String nomeArquivo = cpfLimpo + extensao_arquivo2;
                            caminhoArquivo = getPastaDocumentos() + CFG.ENFERMAGEM_INDICACAO_TRABALHO + System.getProperty("file.separator") + nomeArquivo;
                            arquivoDocumento = new File(caminhoArquivo);
                            indicacaotrabalho.write(arquivoDocumento);
                            arquivoIndicacaoTrabalho = nomeArquivo;
                        } else {
                            arquivoIndicacaoTrabalho = "NAO RECEBIDO";
                        }

                        id = q.cadastraENFERMAGEM(getSQL(), nome, endereco, bairro, cep, cidade, estado,
                                telfixo, telcel, email, pai, mae, nascimento, sexo, cidadenasc, estadonasc,
                                pais, nacionalidade, estadocivil, rg, ufrg, emissaorg, cpf, titulo, uftitulo,
                                zonatitulo, secaotitulo, curso, instituicaocurso, iniciocurso, fimcurso,
                                cursonivel, localtrabalho, teltrabalho, cargotrabalho, cidadetrabalho,
                                estadotrabalho, computador, termoedital, linklattes, arquivoCertificadoCurso,
                                arquivoIndicacaoTrabalho, emissoridentidade);

                        out.println("Inscrição realizada com sucesso!.<br /> <a href='" + paginaInicial + "'> Voltar à página do curso.</a>");
                        out.println("<script>");
                        out.println("window.alert('Cadastrado com sucesso!');");
                        out.println("self.location ='" + paginaInicial + "';");
                        out.println("</script>");
                        enviarEmailConfirmacao();
                    } else {
                        out.println("ERRO na inscrição! Usuário já está inscrito! <a href='" + paginaInicial + "'> Voltar à página do curso.</a>");
                        out.println("<script>");
                        out.println("window.alert('Usuário já cadastrado!');");
                        out.println("self.location ='" + paginaInicial + "';");
                        out.println("</script>");
                        String mensagem = new Date() + " - CPF: " + cpf + "\r\n ->Usuário já está inscrito!";
                        System.out.println(mensagem);
                        enviarEmailProblema(mensagem);
                    }
                } else {
                    out.println("ERRO na inscrição! <a href='" + paginaInicial + "'> Voltar à página do curso.</a>");
                    out.println("<script>window.alert('Erro ao enviar arquivos!');history.go(-1);</script>");
                    String mensagem = new Date() + " - CPF: " + cpf + " - Nome: " + nome + "\r\n ->Erro ao enviar arquivos! Formulário não é MULTIPART!";
                    System.out.println(mensagem);
                    enviarEmailProblema(mensagem);
                }
            }
        } catch (UnsupportedDataTypeException ex) {
            out.println("<script>");
            out.println("window.alert('Não é possível se inscrever nesse curso! Fora do prazo de inscrição!');");
            out.println("self.location ='" + paginaInicial + "';");
            out.println("</script>");
            out.println("Não é possível se inscrever nesse curso!  Fora do prazo de inscrição!<br /><a href='" + paginaInicial + "'> Voltar à página do curso.</a>");
            String mensagem = new Date() + " - CPF: " + cpf + " - Nome: " + nome + "\r\n ->Não é possível se inscrever nesse curso!  Fora do prazo de inscrição!";
            System.out.println(mensagem + "\n" + ex);
            enviarEmailProblema(mensagem + "<br /><em>" + ex + "</em>");
        } catch (Exception ex) {
            out.println("<script>");
            out.println("window.alert('Erro ao cadastrar! Entre em contato com Suporte para tentar resolver o seu problema.');");
            out.println("self.location ='" + paginaInicial + "';");
            out.println("</script>");
            out.println("ERRO na inscrição! <a href='" + paginaInicial + "'> Voltar à página do curso.</a>");
            String mensagem = new Date() + " - CPF: " + cpf + " - Nome: " + nome + "\r\n ->" + ex;
            System.out.println(mensagem + "\n" + ex);
            enviarEmailProblema(mensagem + "<br /><em>" + ex + "</em>");
        } finally {
            out.println("</body>");
            out.println("</html>");
            out.close();
        }

    }

    private ServletFileUpload getHandler() throws FileUploadException {
        DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
        /*
         *Set the size threshold, above which content will be stored on disk.
         */
        //fileItemFactory.setSizeThreshold(MAX_SIZE_UPLOAD);
        /*
         * Set the temporary directory to store the uploaded files of size above threshold.
         */
        fileItemFactory.setRepository(tmpDir);

        ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
        uploadHandler.setHeaderEncoding(ENCODING);
        uploadHandler.setFileSizeMax(MAX_SIZE_UPLOAD);

        return uploadHandler;
    }

    private List getItemsRequest(HttpServletRequest request, ServletFileUpload uploadHandler) throws FileUploadException {
        return uploadHandler.parseRequest(request);
    }

    private String getParameter(String fieldName, List items) throws UnsupportedEncodingException {
        // Process the uploaded items
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
            if (item.isFormField()) {
                if (item.getFieldName().equalsIgnoreCase(fieldName)) {
                    return new String(item.getString().getBytes("iso-8859-1"), "UTF-8");
                }
            }
        }
        return null;
    }

    private FileItem getFile(String fieldName, List items) {
        // Process the uploaded items
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
            if (!item.isFormField()) {
                if (item.getFieldName().equalsIgnoreCase(fieldName)) {
                    return item;
                }
            }
        }
        return null;
    }

    private String getPastaDocumentos() {
        String root = getServletContext().getRealPath("/");
        /*String localDocumentos = root.substring(0, root.lastIndexOf(getServletContext().getContextPath().replace("/", System.getProperty("file.separator"))))
         + System.getProperty("file.separator") + CFG.DIRETORIO_ARQUIVOS
         + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS
         + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS_IPTSP2;*/
        String localDocumentos = "/var/lib/tomcat6/webapps/" + CFG.DIRETORIO_ARQUIVOS
                + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS
                + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS_ENFERMAGEM;
        return localDocumentos + System.getProperty("file.separator");
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (MessagingException ex) {
            Logger.getLogger(formularioEnfermagem.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (MessagingException ex) {
            Logger.getLogger(formularioEnfermagem.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    public String getSQL() {
        return "INSERT INTO "+CFG.BD_AMST+" ("
                + "`nome`,"
                + "`endereco`,"
                + "`bairro`,"
                + "`cep`,"
                + "`cidade`,"
                + "`estado`,"
                + "`telfixo`,"
                + "`telcel`,"
                + "`email`,"
                + "`pai`,"
                + "`mae`,"
                + "`nascimento`,"
                + "`cidadenasc`,"
                + "`estadonasc`,"
                + "`sexo`,"
                + "`pais`,"
                + "`nacionalidade`,"
                + "`estadocivil`,"
                + "`rg`,"
                + "`ufrg`,"
                + "`emissaorg`,"
                + "`cpf`,"
                + "`titulo`,"
                + "`uftitulo`,"
                + "`zonatitulo`,"
                + "`secaotitulo`,"
                + "`curso`,"
                + "`instituicaocurso`,"
                + "`iniciocurso`,"
                + "`fimcurso`,"
                + "`cursonivel`,"
                + "`localtrabalho`,"
                + "`cargotrabalho`,"
                + "`cidadetrabalho`,"
                + "`estadotrabalho`,"
                + "`computador`,"
                + "`termoedital`,"
                + "`linklattes`,"
                + "`certificadocurso`,"
                + "`indicacaotrabalho`,"
                + "`emissoridentidade`,"
                + "`teltrabalho`"
                + ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
    }

    private String getExtensaoArquivo(String name) {
        if (name.lastIndexOf(".") > 0) {
            return name.substring(name.lastIndexOf("."), name.length());
        } else {
            return "";
        }
    }

    private void enviarEmailProblema(String mensagem) {
        try {
            Comunicacao c = new Comunicacao();
            String assunto = "Erro no envio de formulário Enfermagem";
            c.enviarEmail(CFG.EMAIL_ADMINISTRADORES,
                    assunto, mensagem, "noreply@ciar.ufg.br");
        } catch (MessagingException ex) {
        }
    }

    private void enviarEmailConfirmacao() {
        try {
            Comunicacao c = new Comunicacao();
            String mensagem = "Olá, " + nome + ". Sua inscrição no CURSO DE ATUALIZAÇÃO MULTIPROFISSIONAL EM SAÚDE DO TRABALHADOR, oferecido pela Universidade Federal de Goiás, de número " + id + ", foi confirmada.";
            String assunto = "Confirmação de inscrição Faculdade de Enfermagem - UFG";
            c.enviarEmail(new String[]{email, emailAdministrador}, assunto, mensagem, "noreply@ciar.ufg.br");
        } catch (MessagingException ex) {
            System.out.println(new Date() + " - CPF: " + cpf + " - Erro ao enviar e-mail de confirmação de inscrição.");
        }
    }
}
